#define _CRT_SECURE_NO_WARNINGS


#include"circularQueue.h"

//MyCircularQueue* myCircularQueueCreate(int k)
//{
//    MyCircularQueue* queue = (MyCircularQueue*)malloc(sizeof(MyCircularQueue));
//    queue->q = (QDataType*)malloc(sizeof(QDataType) * (k + 1));
//    queue->front = queue->rear = 0;
//    queue->N = k + 1;
//
//    return queue;
//}
//
//bool myCircularQueueEnQueue(MyCircularQueue* obj, int value)
//{
//    if (myCircularQueueIsFull(obj))
//    {
//        return false;
//    }
//    else
//    {
//        obj->q[obj->rear] = value;
//        obj->rear = (obj->rear + 1) % obj->N;
//        return true;
//    }
//}
//
//bool myCircularQueueDeQueue(MyCircularQueue* obj)
//{
//    if (myCircularQueueIsEmpty(obj))
//    {
//        return false;
//    }
//    else
//    {
//        obj->rear = (obj->rear - 1 + obj->N) % obj->N;
//        return true;
//    }
//}
//
//int myCircularQueueFront(MyCircularQueue* obj)
//{
//    if (myCircularQueueIsEmpty(obj))
//    {
//        return -1;
//    }
//    else
//    {
//        return obj->q[obj->front];
//    }
//}
//
//int myCircularQueueRear(MyCircularQueue* obj)
//{
//    if (myCircularQueueIsEmpty(obj))
//    {
//        return -1;
//    }
//    else
//    {
//        return obj->q[obj->rear];
//    }
//}
//
//bool myCircularQueueIsEmpty(MyCircularQueue* obj)
//{
//    return obj->front == obj->rear;
//}
//
//bool myCircularQueueIsFull(MyCircularQueue* obj)
//{
//    return (obj->rear + 1) % (obj->N) == obj->front;
//}
//
//void myCircularQueueFree(MyCircularQueue* obj)
//{
//    free(obj->q);
//    obj->front = obj->rear = obj->N = 0;
//    free(obj);
//}

MyCircularQueue* myCircularQueueCreate(int k)
{
	MyCircularQueue* queue = (MyCircularQueue*)malloc(sizeof(MyCircularQueue));
	if (queue == NULL)
	{
		printf("mallco fail\n");
		exit(-1);
	}
	queue->data = (CQDataType*)malloc(sizeof(CQDataType) * (k + 1));
	if (queue->data == NULL)
	{
		printf("mallco fail\n");
		exit(-1);
	}
	queue->front = queue->rear = 0;
	queue->capacity = k;
	return queue;
}

bool myCircularQueueEnQueue(MyCircularQueue* obj, int value)
{
	if (myCircularQueueIsFull(obj))
		return false;

	obj->data[obj->rear] = value;
	obj->rear = (obj->rear + 1) % (obj->capacity + 1);
	return true;
}

bool myCircularQueueDeQueue(MyCircularQueue* obj)
{
	if (myCircularQueueIsEmpty(obj))
		return false;

	obj->front = (obj->front + 1) % (obj->capacity + 1);
	return true;
}

int myCircularQueueFront(MyCircularQueue* obj)
{
	if (obj->front == obj->rear)
		return -1;

	return obj->data[obj->front];
}

int myCircularQueueRear(MyCircularQueue* obj)
{
	if (obj->front == obj->rear)
		return -1;


	if (obj->rear != 0)
		return obj->data[obj->rear - 1];
	else
		return obj->data[obj->capacity];
}

bool myCircularQueueIsEmpty(MyCircularQueue* obj)
{
	assert(obj);

	return obj->front == obj->rear;
}

bool myCircularQueueIsFull(MyCircularQueue* obj)
{
	assert(obj);

	return ((obj->rear + 1) % (obj->capacity + 1)) == obj->front;
}

void myCircularQueueFree(MyCircularQueue* obj)
{
	assert(obj);

	free(obj->data);
	obj->data = NULL;
	free(obj);
	obj = NULL;
}